package com.deer.wms.base.system.service.box;


import com.deer.wms.base.system.model.box.*;
import com.deer.wms.base.system.model.task.TaskInfo;
import com.deer.wms.base.system.model.task.TaskInfoDto;
import com.deer.wms.base.system.model.ware.CellInfo;
import com.deer.wms.base.system.model.ware.CellInfoDto;
import com.deer.wms.base.system.model.zh.WorkTasks;
import com.deer.wms.common.core.service.Service;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 组盘 服务层
 * 
 * @author guo
 * @date 2019-06-03
 */
public interface IBoxItemService extends Service<BoxItem, String>{
	/**
	 * 入库更新时校验库存
	 * @param boxItem
	 * @return
	 */
	BoxItem verifyBoxItem(BoxItem boxItem);
	/**
	 * 查询盘点库存列表信息
	 * @param criteria
	 * @return
	 */
	List<BoxItemDto> findTaskStockList(BoxItemCriteria criteria);

	List<BoxItemDto> findTaskExportList();

	/**
	 * 总记录数
	 *
	 * @return 库存总数和工单备料的数量
	 */
	int BoxItemCount();
	/**
	 * 工单备料的数量
	 */
	int BoxItemByCountState();
	/**
	 * 首页显示物料，以及对应的库存数，预警数
	 * @return
	 */
	List<BoxItemDto> getBoxItemDtoInMain(BoxItemCriteria criteria);
	/**
	 * 通过编码修改实发数
	 *
	 * @param boxItem 拿出托盘/料箱编码
	 * @return 结果
	 */
	public int updateBoxItemQuantity(BoxItem boxItem);

	/**
	 *	关联查询托盘相关信息
	 *
	 * @return
	 */
	public List<BoxItemDto> selectBoxItemDtoList(BoxItemCriteria boxItemCriteria);



	/**
	 * 根据托盘编码寻找所有在货位上的托盘和其他信息  便于统计数据
	 *
	 * @param itemCode
	 * @return
	 */
	public List<BoxItemDto> getBoxItemDtoByitemCode(String itemCode);

	/**
	 * 根据任务id查询托盘信息
	 *
	 * @param taskId
	 * @return
	 */
	public BoxItem getBoxItemByTaskId(String taskId);

	/**
	 * 根据物料编码查询货位信息  (根据批次排序， 保证先进先出)
	 *
	 * @param itemCode
	 * @return
	 */
	public List<BoxItemDto> getFullCellInfoForOutOfStock(String itemCode);


	/**
	 *
	 * 出库任务，寻找合适的出库货位(根据货物编码)
	 *
	 * @param itemCode
	 * @param quantity
	 * @return   返回类型集合， 当最早批次货位货物数量不够时，继续用别的货位,一直不够就一直加，直到所有货位都出货
	 */
	public List<BoxItemDto>  getFullCellInfoForOutOfStockForSaveTaskInfo(String itemCode, Integer quantity);



	/**
	 * 根据 托盘编码查找托盘
	 *
	 * @param boxCode
	 * @return
	 */
	public BoxItem getBoxItemByBoxCode(String boxCode);

	/***
	 *出库时同步库存历史表查询
	 * @author 李帅辰
	 * @date 2020/10/23 15:51
	 * @return com.deer.wms.base.system.model.box.BoxItemDto
	 */
	BoxItemDto billOutGetBoxItemByBoxCode(String boxCode);
	/**
     * 查询组盘信息
     * 
     * @param id 组盘ID
     * @return 组盘信息
     */
	public BoxItemDto selectBoxItemById(Integer id);
	
	/**
     * 查询组盘列表
     * 
     * @param boxItem 组盘信息
     * @return 组盘集合
     */
	public List<BoxItem> selectBoxItemList(BoxItem boxItem);

	/**
	 * 查询出库物料详情
	 * @param boxItemCriteria
	 * @return
	 */
	public List<BoxItemDto> findBoxItemDetail(BoxItemCriteria boxItemCriteria);


	/**
     * 新增组盘
     * 
     * @param boxItem 组盘信息
     * @return 结果
     */
	public int insertBoxItem(BoxItem boxItem);


	
	/**
     * 修改组盘
     * 
     * @param boxItem 组盘信息
     * @return 结果
     */
	public int updateBoxItem(BoxItem boxItem);
		
	/**
     * 删除组盘信息
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
	public int deleteBoxItemByIds(String ids);

	/**
	 * 删除组盘
	 *
	 * @param id 组盘ID
	 * @return 结果
	 */
	public int deleteBoxItemById(Long id);

	/**
	 * 根据id升序查找第一个可合框物料
	 */
	BoxItem findOneCombineBoxGroupByItemCodeAndBatch();

	/**
	 * 根据物料编码与批次查询多条可合框货位
	 */
	List<BoxItemDto> findMoreCombineBoxByItemCodeAndBatch(BoxItem boxItem);


	/**
	 * 查找工单备料货位
	 *
	 * @return
	 */
	List<BoxItemDto> findByWorkerOrder(BoxItemCriteria criteria);

	void deleteByBoxCode(String boxCode);

	/**
	 * 查找合适的货位进行预测备料
	 */
	List<BoxItemDto> findSuitByItemCodeAndQuantity(String itemCode, Integer quantity);

	//根据条件查询信息
	List<BoxItemDto> findList(BoxItemCriteria criteria);
	//根据查询条件呆滞过期物料
	List<BoxItemDto> findSluggishOverdue(BoxItemCriteria criteria);
	//根据条件查询即将过期物料
	List<BoxItemDto> findWillOverdue(BoxItemCriteria criteria);

	List<BoxItemDto> findBoxItemList(BoxItemCriteria criteria);

	/**
	 * 工单出库点数箱中数量缺少（查找符合数量的箱数到指定货位）
	 * @param criteria
	 * @return
	 */
	List<BoxItemDto> workerOrderLackOut(BoxItemCriteria criteria);

	/**
	 * 根据条件查询不合格库存滞库超过设定日期
	 * @param criteria
	 * @return
	 */
	List<UnqualifiedOverTakeCanDelayDays> findUnqualifiedOverTakeCanDelayDays(BoxItemCriteria criteria);


	/**
	 * 出库消息时查询
	 * @param boxItemDto
	 * @return
	 */
	List<BoxItemDto> findListByItemCode(BoxItemDto boxItemDto);
	/***
	 *指定货位时查询
	 * @author 李帅辰
	 * @date 2020/10/15 11:49
	 * @return com.deer.wms.base.system.model.box.BoxItemDto
	 */
	BoxItemDto assignBillOutFindBoxCode(BoxItemDto boxItemDto);

	/**
	 * 出库时判读物料库存
	 * @param boxItem
	 * @return
	 */
	Integer getSumQuantityByItemCode(BoxItem boxItem);
	/**
	 * 出库时查询托盘具体的存放位置
	 * @param boxCode
	 * @return
	 */
	BoxItemDto selectBoxItemByBoxCode(String boxCode);

	/**
	 * 出库发消息时查询需要的消息内容
	 * @param boxItemDto
	 * @return
	 */
	BoxItemDto selectBoxItemByboxItemDto(BoxItemDto boxItemDto);

	List<StockOverViewDo> findExportList();

	List<StockOverviewDto> findStockOverviewList(StockOverviewDto stockOverviewDto);
	/***
	 *指定货位出库时查询托盘，货位
	 * @author 李帅辰
	 * @date 2020/10/14 11:12
	 * @return java.util.List<com.deer.wms.base.system.model.box.BoxItemDto>
	 */
	List<BoxItemDto> assignBoxItem(BoxItemDto boxItemDto);


	List<BoxItem> findBoxItemByCarrierId(BoxItemCriteria boxItemCriteria);

	List<BoxItemDto> selectRevolutionStorageList(BoxItemCriteria boxItemCriteria);

	/**
	 *通过托号查询库存id
	 * @author 李帅辰
	 * @date 2021/6/25 9:48
	 * @return com.deer.wms.base.system.model.box.BoxItem
	 */
	BoxItem findIdByCarrierId(String carrierId);

	List<BoxItemDto> getQuantityByShelfId(@Param("shelfId") Integer shelfId);

	/**
	 *通过货区ID 查询库存信息
	 * @author 李帅辰
	 * @date 2021/6/25 19:48
	 * @return java.util.List<com.deer.wms.base.system.model.box.BoxItemDto>
	 */
	List<BoxItemDto> findBoxItemDtoListByAreaId(BoxItemCriteria boxItemCriteria);

	/**
	 *库存总览
	 * @author 李帅辰
	 * @date 2021/6/27 12:29
	 * @return java.util.List<com.deer.wms.base.system.model.box.BoxItemDto>
	 */
	List<BoxItemDto> boxPandect(BoxItemCriteria boxItemCriteria);

	List<BoxItemDto> findBoxItemDtoDetailByAreaId(BoxItemCriteria boxItemCriteria);

	List<BoxItemExport> findBoxItemDtoMainListByAreaId(BoxItemCriteria boxItemCriteria);

	/*原料区总览列表*/
	List<BoxItemDto> selectBoxItem(BoxItemDto boxItemDto);


	/*原料区库存明细*/
	List<BoxItemDto> selectBoxItemDetail(BoxItemDto boxItemDto);
	/*根据任务号查询入库明细*/
	BoxItemDto findBoxItemMsgByTaskNumber(WorkTasks workTasks);
	/*冻结库存*/
	int blockedBoxItem(Long id);
	/*解冻库存*/
	int unfreezeBoxItem(Long id);
	/*线边仓列表*/
    List<BoxItemDto> selectBoxItemLine(BoxItemDto boxItemDto);
	/*查询物料的商家构成*/
    List<BoxItemDto> findBoxItemByItemId(Integer itemId);
	/*新增线边仓*/
	void insertBoxItemEdge(BoxItemDto boxItem);
	/*根据任务号添加托盘货位*/
    void saveBoxItemByTaskNumber(TaskInfo taskInfo);
	/*解除手工创建入库,库存冻结状态*/
	void updateBySapId(Integer billInSapId);
	/*根据唯一流水批号,减少线边仓库存*/
    void updateBoxItemEdgeByBatch(WorkTasks workTasks);
	/*根据明细id修改托盘重量*/
    void updatetBoxItemByDetailId(BoxItem boxItem);
	/*查询库房所有批次*/
    List<BoxItemDto> findBoxItemBatch();

    List<CellInfo> findPai(CellInfo cellInfo);
	List<CellInfo> findLie(CellInfo cellInfo);
	List<CellInfo> findCeng(CellInfo cellInfo);
	List<CellInfo> findCell(CellInfo cellInfo);
	/*根据托盘id查库位信息*/
	CellInfoDto findCellById(Integer id);
	/*更改托盘库位*/
	void updateBoxItemCell(BoxItemDto boxItemDto);
	/*移库成功,解冻托盘*/
	void updateBoxItemState(String cellCode);
	/*查询剩余重量*/
	Float findBoxItemEdgeByBatch(WorkTasks workTask);
	/*删除消耗完的物料*/
	void delBoxItem(WorkTasks workTask);
    /*查是否存在次条码*/
    int findEdgeSumByBatch(WorkTasks workTask);
	/*质量转换*/
    void updateBillInState(BoxItemDto boxItem);
	/*批次转换*/
	void updateBatch(BoxItemDto boxItem);
	/*查托盘信息*/
	BoxItemDto findBoxItemMSG(Long id);
	/*质量转换单*/
	void insertBoxItemState(BoxItemState boxItemState);
	/*质量转换明细*/
	void insertBoxItemStateDetail(BoxItemStateDetail boxItemStateDetail);
	/*查询质量转换记录单*/
    List<BoxItemStateDetail> selectBoxItemStateList(BoxItemStateDetail boxItemStateDetail);
	/*根据id查质量转换单*/
    BoxItemState findStateById(Integer stateId);
	/*根据id查质量转换单明细*/
	List<BoxItemStateDetail> findListdetail(Integer stateId);

	List<BoxItemDto> findBoxBatchByItemId(Integer itemId);
	/*出库前往线边仓*/
	void outBoxItem(Long id);
	/*修改批次单*/
	void insertBoxItemBatch(BoxItemBatch boxItemBatch);
	/*修改批次明细*/
	void insertBoxItemBatchDetail(BoxItemBatchDetail boxItemBatchDetail);

	List<BoxItemBatchDetail> selectBoxItemBatchList(BoxItemBatchDetail boxItemBatchDetail);

	/*导出批次转换列表*/
	BoxItemBatchDetail selectBoxItemBatch(int id);
	/*修改已导出状态*/
	void updateExcelBatchState(int id);
	/*导出质量转换列表*/
	BoxItemStateDetail selectBoxItemState(int id);
	/*修改质量转换状态*/
	void updateExcelStateState(int id);

    List<BoxItemDto> selectBoxItemWarning(BoxItemDto boxItemDto);
	/*日结库存*/
    List<BoxItemToday> selectBoxItemToday(BoxItemToday boxItemToday);
	/*指定出库查物料*/
	List<BoxItemDto> findBoxItemAll(BoxItemDto boxItemDto);

	List<BoxItemToday> selectBoxItemHistory(BoxItemToday boxItemToday);
	/*根据id查托*/
    BoxItemDto findByItemId(Long id);
	/*库存明细合计*/
	BoxItemDto selectBoxItemAll(BoxItemDto boxItemDto);
}
